/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package muhnes.sizoo.validador;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
 
public class NumeroValidator implements Validator{
    
    private final String patronNumero = "^[-+]?[0-9]*\\.?[0-9]+$";
    
    @Override
    public void validate(FacesContext contexto, UIComponent componente, Object valor)
        throws ValidatorException {
        
        String opc = (String) componente.getAttributes().get("opcional");
        boolean opcional = opc != null && !opc.isEmpty() ? Boolean.parseBoolean(opc) : false;
         
        String min = (String) componente.getAttributes().get("minimo");
        double valorMinimo = Double.MIN_VALUE;
        try {
            valorMinimo = min != null && min.matches( patronNumero ) ? Double.parseDouble( min ) : valorMinimo;
        } catch (NumberFormatException ex) {
            Logger.getLogger(NumeroValidator.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        String max = (String) componente.getAttributes().get("maximo");
        double valorMaximo =  Double.MAX_VALUE;
        try {
            valorMaximo = max != null && max.matches( patronNumero ) ? Double.parseDouble( max ) : Double.MAX_VALUE;
        } catch (NumberFormatException ex) {
            Logger.getLogger(NumeroValidator.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        String val = valor.toString();
        double cantidad = Double.NaN;
        try {
            cantidad = val != null && val.matches( patronNumero ) ? Double.parseDouble( val ) : cantidad;
        } catch (NumberFormatException ex) {
            Logger.getLogger(NumeroValidator.class.getName()).log(Level.SEVERE, null, ex);
        }
                
        if( Double.isNaN( cantidad ) && !opcional ) {
            FacesMessage mensaje = new FacesMessage();
            mensaje.setSeverity( FacesMessage.SEVERITY_ERROR );
            mensaje.setSummary( "El campo debe ser un valor numérico." );
            mensaje.setDetail( "El campo es obligatorio y debe contener un valor numérico." );
            contexto.addMessage( componente.getClientId(), mensaje );
            throw new ValidatorException( mensaje );
        }
        else if( (valorMinimo > cantidad || cantidad > valorMaximo) && !opcional ) {
            FacesMessage mensaje = new FacesMessage();
            mensaje.setSeverity( FacesMessage.SEVERITY_ERROR );
            mensaje.setSummary( "El valor esta fuera de rango." );
            mensaje.setDetail( String.format("El valor debe estar entre " + valorMinimo + " y " + valorMaximo, valorMinimo, valorMaximo ) );
            contexto.addMessage( componente.getClientId(), mensaje );
            throw new ValidatorException( mensaje );
        }
    }
    
}
